/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.eventos.beans;

import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.cip.esymons.eventos.bc.AreaDelegate;
import org.cip.esymons.eventos.bc.DirectorioInvitacionDelegate;
import org.cip.esymons.eventos.bc.EventoDelegate;
import org.cip.esymons.eventos.be.DirectorioInvitacion;
import org.cip.esymons.eventos.be.Evento;
import org.cip.esymons.eventos.be.Preevento;
import org.cip.esymons.general.bc.PersonaJuridicaDelegate;
import org.cip.esymons.general.be.Area;
import org.cip.esymons.general.be.PersonaJuridica;
import org.cip.esymons.general.util.Utiles;

/**
 *
 * @author LizardoR
 */
public class DirectorioInvitacionController {

    private DirectorioInvitacionDelegate delegado;
    private PersonaJuridicaDelegate delegadoEmpresa;
    private DirectorioInvitacion directorio;
    private List<DirectorioInvitacion> listaDirectorio;
    private List<PersonaJuridica> listaEmpresa;
    private Integer areCodigo;
    private Long solCodigo;
    private Long dinCodigo;
//    private Long subCodigo;
    private Integer eveCodigo;
    private String totalEmpresas;
    private String totalDirectorio;

    /*********************** Constructor de la clase *************************/
    public DirectorioInvitacionController() {
        inicializar();
    }

    /*************************** Sets y Gettters *****************************/
    public Long getDinCodigo() {
        return dinCodigo;
    }

    public void setDinCodigo(Long dinCodigo) {
        this.dinCodigo = dinCodigo;
    }

    public Integer getEveCodigo() {
        return eveCodigo;
    }

    public void setEveCodigo(Integer eveCodigo) {
        this.eveCodigo = eveCodigo;
    }

    public List<PersonaJuridica> getListaEmpresa() {
        return listaEmpresa;
    }

    public void setListaEmpresa(List<PersonaJuridica> listaEmpresa) {
        this.listaEmpresa = listaEmpresa;
    }

    public PersonaJuridicaDelegate getDelegadoEmpresa() {
        return delegadoEmpresa;
    }

    public void setDelegadoEmpresa(PersonaJuridicaDelegate delegadoEmpresa) {
        this.delegadoEmpresa = delegadoEmpresa;
    }

    public String getTotalDirectorio() {
        return totalDirectorio;
    }

    public void setTotalDirectorio(String totalDirectorio) {
        this.totalDirectorio = totalDirectorio;
    }

    public String getTotalEmpresas() {
        return totalEmpresas;
    }

    public void setTotalEmpresas(String totalEmpresas) {
        this.totalEmpresas = totalEmpresas;
    }



//    public Long getSubCodigo() {
//        return subCodigo;
//    }
//
//    public void setSubCodigo(Long subCodigo) {
//        this.subCodigo = subCodigo;
//    }
    
    public Integer getAreCodigo() {
        return areCodigo;
    }

    public void setAreCodigo(Integer areCodigo) {
        this.areCodigo = areCodigo;
    }

    public Long getSolCodigo() {
        return solCodigo;
    }

    public void setSolCodigo(Long solCodigo) {
        this.solCodigo = solCodigo;
    }

    public DirectorioInvitacionDelegate getDelegado() {
        return delegado;
    }

    public void setDelegado(DirectorioInvitacionDelegate delegado) {
        this.delegado = delegado;
    }

    public DirectorioInvitacion getDirectorio() {
        return directorio;
    }

    public void setDirectorio(DirectorioInvitacion directorio) {
        this.directorio = directorio;
    }

    public List<DirectorioInvitacion> getListaDirectorio() {
        return listaDirectorio;
    }

    public void setListaDirectorio(List<DirectorioInvitacion> listaDirectorio) {
        this.listaDirectorio = listaDirectorio;
    }

    /**************************** Metodos ************************************/
    public String inicializar() {
        try {
            directorio= new DirectorioInvitacion();
            delegado = new DirectorioInvitacionDelegate();
            delegadoEmpresa = new PersonaJuridicaDelegate();
            listaDirectorio = new ArrayList<DirectorioInvitacion>();
            listaEmpresa = new ArrayList<PersonaJuridica>();
            directorio.setDinMail("@");
            totalEmpresas = "no hay empresas en lista";
            totalDirectorio = "no hay invitaciones en lista";
            //listar();
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex.getMessage());
        }
        //ImageIO image = new ImageIO();
        return "";
    }

    public String listar() {
        try {
            limpiarDatos();
            listaDirectorio = delegado.findAll();
            listaEmpresa = delegadoEmpresa.listarTodo();
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex.getMessage());
        }
        return "listar";
    }

    public String listarTablas() {
        try {
            eveCodigo = (eveCodigo != null) ? eveCodigo : 0;
            areCodigo = (areCodigo != null) ? areCodigo : 0;
            listaEmpresa = delegado.listarEmpresas(eveCodigo, areCodigo);
            totalEmpresas = Utiles.totalRegistro(listaEmpresa, "empresas en lista");
            //listaDirectorio = delegado.listarDirectoriosInvitacion(eveCodigo, areCodigo);
            listaDirectorio = delegado.listarDirectorios(eveCodigo, areCodigo);
            totalDirectorio = Utiles.totalRegistro(listaDirectorio, "invitaciones en lista");
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex.getMessage());
        }
        return null;
    }

    public String agregarEmpresas() {
        try {
            eveCodigo = (eveCodigo != null) ? eveCodigo : 0;
            areCodigo = (areCodigo != null) ? areCodigo : 0;
            Evento e = new Evento();
            EventoDelegate delegadoEvento = new EventoDelegate();
            e = delegadoEvento.find(eveCodigo);
            Area a = new Area();
            AreaDelegate delegadoArea = new AreaDelegate();
            a = delegadoArea.buscar(areCodigo);
            for (PersonaJuridica pj : listaEmpresa) {
                System.out.println("seleccion: " + pj.getSeleccion());
                Boolean seleccion = (pj.getSeleccion() != null) ? pj.getSeleccion() : false;
                System.out.println("seleccion validado!: " + seleccion);
                if (seleccion) {
                    DirectorioInvitacion di = new DirectorioInvitacion();
                    di.setEveCodigo(e);
                    di.setAreCodigo(a);
                    di.setEmpCodigo(pj);
                    delegado.create(di);
                    di = null;
                }
            }
            e = null;
            a = null;
            delegadoEvento = null;
            delegadoArea = null;
        } catch (Exception ex) {
            System.out.println("ERROR: " + ex.getMessage());
        }
        return listarTablas();
    }

    public String guardar() {
        try {
            for (DirectorioInvitacion di : listaDirectorio) {
                delegado.edit(di);
            }
            mostrarMensaje("INFO: ", "Se actualizó sastifactoriamente los directorios...", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al guardar los directorios...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String navegar_nuevo() {
        return "nuevo";
    }

    public String navegar_editar() {
        leerCodigoCombos();
        return "editar";
    }

    public void leerCodigoCombos() {
        if (directorio != null) {
            Evento p = new Evento();
            p = directorio.getEveCodigo();
            if (p != null) eveCodigo = p.getEveCodigo();
            p = null;

            Area a = new Area();
            a = directorio.getAreCodigo();
            if (a != null) areCodigo = a.getAreCodigo();
            a = null;

            PersonaJuridica e = new PersonaJuridica();
            e = directorio.getEmpCodigo();
            if (e != null) solCodigo = e.getSolCodigo();
            e = null;

//            DirectorioInvitacion s = new DirectorioInvitacion();
//            s = directorio.getSubCodigo();
//            if (s != null) subCodigo = s.getDinCodigo();
//            s = null;
            
            //limpiar data nula
            eveCodigo = (eveCodigo != null) ? eveCodigo : 0;
            areCodigo = (areCodigo != null) ? areCodigo : 0;
            solCodigo = (solCodigo != null) ? solCodigo : 0;
//            subCodigo = (subCodigo != null) ? subCodigo : 0;
        }
    }

    public void recogerDatos() {
        try {
            Evento p = new Evento();
            EventoDelegate delegadoEvento = new EventoDelegate();
            eveCodigo = (eveCodigo!=null) ? eveCodigo : 0;
            p = delegadoEvento.buscarEvento(eveCodigo);
            directorio.setEveCodigo(p);

            Area a = new Area();
            AreaDelegate delegadoArea = new AreaDelegate();
            areCodigo = (areCodigo!=null) ? areCodigo : 0;
            a = delegadoArea.buscar(areCodigo);
            directorio.setAreCodigo(a);

            PersonaJuridica e = new PersonaJuridica();
            PersonaJuridicaDelegate delegadoEmpresarial = new PersonaJuridicaDelegate();
            solCodigo = (solCodigo!=null) ? solCodigo : 0;
            e = delegadoEmpresarial.buscarxId(solCodigo);
            directorio.setEmpCodigo(e);

//            DirectorioInvitacion d = new DirectorioInvitacion();
//            DirectorioInvitacionDelegate delegadoDir = new DirectorioInvitacionDelegate();
//            dinCodigo = (dinCodigo!=null) ? dinCodigo : 0;
//            d = delegadoDir.find(dinCodigo);
//            directorio.setSubCodigo(d);

            delegadoEvento = null;
            delegadoArea = null;
            delegadoEmpresarial = null;
//            delegadoDir = null;

            p = null;
            a = null;
            e = null;
//            d = null;
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "al recoger los datos...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
    }

    public void limpiarDatos(){
        directorio = new DirectorioInvitacion();
        eveCodigo = 0;
        areCodigo = 0;
        solCodigo = new Long(0);
        dinCodigo = new Long(0);
    }

    public String insertar() {
        try {
            recogerDatos();
            delegado.create(directorio);
            mostrarMensaje("INFO: ", "Directorio registrado sastifactoriamente...", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "al insertar un directorio...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String actualizar() {
        try {
            recogerDatos();
            delegado.edit(directorio);
            mostrarMensaje("INFO: ", "Directorio actualizado sastifactoriamente...", FacesMessage.SEVERITY_INFO);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "al actualizar un directorio...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String eliminar() {
        try {
            delegado.remove(directorio);
            listarTablas();
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "al eliminar un directorio...", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public SelectItem[] getComboEventos() {
        //Combo Eventos Activos
        try {
            List<Preevento> listaEvento = new ArrayList<Preevento>();
            EventoDelegate delegadoEvento = new EventoDelegate();
            listaEvento = delegadoEvento.ListarEventosActivos();
            SelectItem[] comboInfluencia = new SelectItem[listaEvento.size()];
            for (int i = 0; i < listaEvento.size(); i++) {
                String abrev = "";
                if (listaEvento.get(i).getPreNombre().length() > 45) {
                    abrev = listaEvento.get(i).getPreNombre().substring(0, 45);
                } else {
                    abrev = listaEvento.get(i).getPreNombre();
                }
                comboInfluencia[i] = new SelectItem(listaEvento.get(i).getPreCodigo(), abrev);
            }
            return comboInfluencia;

        } catch (Exception e) {
            //Mensaje al usuario
            //listaEvento = new ArrayList<Evento>();
            SelectItem[] comboInfluencia = new SelectItem[1];
            comboInfluencia[0] = new SelectItem(new Preevento(), "No hay Eventos");
            return comboInfluencia;
        }
    }

    public SelectItem[] getComboAreas() {
        try {
            System.out.println("Ingreso 1");
            AreaDelegate delegadoArea = new AreaDelegate();
            SelectItem[] selects = null;
            List<Area> listaArea = delegadoArea.listarTodos();
            selects = new SelectItem[listaArea.size()];
            int cont = 0;
            for (Area area : listaArea) {
                SelectItem item = new SelectItem(area.getAreCodigo(), area.getAreNombre());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Areas");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboDirectorio() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            List<DirectorioInvitacion> listaDirectorioInvitacion = delegado.findAll();
            selects = new SelectItem[listaDirectorioInvitacion.size()];
            int cont = 0;
            for (DirectorioInvitacion dir : listaDirectorioInvitacion) {
                SelectItem item = new SelectItem(dir.getDinCodigo(), dir.getEmpCodigo().getEmprazonSocial());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Directorios Invitación");
            selects[0] = item;
            return selects;
        }
    }

    public SelectItem[] getComboEmpresa() {
        try {
            System.out.println("Ingreso 1");
            PersonaJuridicaDelegate delegadoEmpresarial = new PersonaJuridicaDelegate();
            SelectItem[] selects = null;
            List<PersonaJuridica> listaEmpresarial = delegadoEmpresarial.listarTodo();
            selects = new SelectItem[listaEmpresarial.size()];
            int cont = 0;
            for (PersonaJuridica empresa : listaEmpresarial) {
                SelectItem item = new SelectItem(empresa.getSolCodigo(), empresa.getEmprazonSocial());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen Empresas");
            selects[0] = item;
            return selects;
        }
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

}
